﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using SOM.AbstractDAL;
using SOM.AbstractDALFactory;
using SOM.Common;
using SOM.ConcreteBL;
using SOM.ConcreteDAL;
using SOM.ConcreteDALFactory;
using SOM.Model;
using FlickrNet;
using SOM.Security;
using Tag = FlickrNet.Tag;

public partial class Reclamacao_CadastroReclamacao : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            Usuario usuario = SOM.Common.Common.RetornarUsuarioSessao(this);

            if (usuario == null)
            {
                FormsAuthentication.RedirectToLoginPage();
                return;
            }

            /*Habilita ou desabilita os controles dos detalhes de acordo 
            com a escolha do usuario*/
            frmAlbumDetalhes.Visible = chbDetalhesAlbum.Checked;
            lkbAlbunDetalhes.Visible = chbDetalhesAlbum.Checked;
            frmVideoDetalhes.Visible = chbDetalhesVideo.Checked;
            lkbDetalhesVideo.Visible = chbDetalhesVideo.Checked;

            if (!IsPostBack)
            {
                SOMAbstractDALFactory factory = new SOMConcreteDALFactory();
                AbstractInstituicaoDAL instituicaoDAL = factory.CreateInstituicaoDAL();

                //Configura drop down de instituições
                ddlInstituicao.DataSource = instituicaoDAL.FindAll();
                ddlInstituicao.DataValueField = "ins_id_instituicao";
                ddlInstituicao.DataTextField = "ins_nm_instituicao";
                ddlInstituicao.DataBind();
                ddlInstituicao.Items.Insert(0, new ListItem("Selecione um instituição...", ""));

                //Configura drop down de albuns do usuário
                ddlAlbuns.Items.Insert(0, new ListItem("Selecione um álbum...", ""));

                tabReclamacaoLocalizacao.OnClientClick = this.uscReclamacaoLocalizacao.getChangeHiddenStateFunction();
            }
        }
        catch (Exception ex)
        {
            lblMensagem.Text = ex.Message + " - " + ex.InnerException;
        }
    }

    //Gera o objeto de vídeo a partir da URL.
    private static string ObterVídeo(string urlVideo)
    {
        string idVideo = urlVideo.Split(new[] { "v=" }, StringSplitOptions.None)[1];
        string scr = @"<object width='100%' height='480'> ";
        scr = scr + @"<param name='movie' value='http://www.youtube.com/v/" + idVideo + "'></param> ";
        scr = scr + @"<param name='allowFullScreen' value='true'></param> ";
        scr = scr + @"<param name='allowscriptaccess' value='always'></param> ";
        scr = scr + @"<embed src='http://www.youtube.com/v/" + idVideo + "' ";
        scr = scr + @"type='application/x-shockwave-flash' allowscriptaccess='always' ";
        scr = scr + @"allowfullscreen='true' width='100%' height='480'> ";
        scr = scr + @"</embed></object>";
        return scr;
    }
    protected void btnSalvar_Click(object sender, EventArgs e)
    {
        try
        {
            if (IsValid)
            {
                ReclamacaoBL reclamacaoBl = new ReclamacaoBL();

                //Cria o objeto reclamacao
                Reclamacao reclamacao = new Reclamacao();

                reclamacao.rec_ds_reclamacao = txtDescricao.Text;
                reclamacao.rec_dt_data = DateTime.Now;
                reclamacao.rec_id_status = (int)StatusDaReclamacao.Pendente;

                //Cria o objeto video
                Video video = new Video();
                video.vdo_ds_url = txtUrlVideo.Text;

                MetadadoVideo metadadoVideo = new MetadadoVideo();
                if (chbDetalhesVideo.Checked)
                {
                    //Cria o objeto metadado
                    metadadoVideo.mtv_ds_titulo = txtTituloVideo.Text.Trim();
                    metadadoVideo.mtv_ds_criador = txtCriadorVideo.Text.Trim();
                    metadadoVideo.mtv_ds_assunto = txtAssuntoVideo.Text.Trim();
                    metadadoVideo.mtv_ds_descricao = txtDescricaoVideo.Text.Trim();
                    metadadoVideo.mtv_nm_publicador = txtPublicadorVideo.Text.Trim();
                    metadadoVideo.mtv_nm_contribuidor = txtContribuidorVideo.Text.Trim();
                    metadadoVideo.mtv_ds_tipo = txtTipoVideo.Text.Trim();
                    metadadoVideo.mtv_ds_formato = txtFormatoVideo.Text.Trim();
                    metadadoVideo.mtv_ds_identificador = txtIdentificadorVideo.Text.Trim();
                    metadadoVideo.mtv_ds_origem = txtOrigemVideo.Text.Trim();
                    metadadoVideo.mtv_ds_idioma = txtIdiomaVideo.Text.Trim();
                    metadadoVideo.mtv_ds_relacao = txtRelacaoVideo.Text.Trim();
                    metadadoVideo.mtv_ds_direitos = txtDireitosVideo.Text.Trim();

                    if (!string.IsNullOrEmpty(txtDataCriacaoVideo.Text))
                        metadadoVideo.mtv_dt_data = Convert.ToDateTime(txtDataCriacaoVideo.Text.Trim());
                    video.mtv_metadado_video = metadadoVideo;
                }

                //Cria o objeto Imagem
                Imagem imagem = new Imagem();
                imagem.img_usr_flickr = txtUsuarioFlickr.Text;
                imagem.img_ds_url = RetornarUrlAlbumFlickr(ddlAlbuns.SelectedValue);

                MetadadoImagem metadadoImagem = new MetadadoImagem();
                if (chbDetalhesAlbum.Checked)
                {
                    //Cria o objeto metadado da imagem
                    metadadoImagem.mti_ds_titulo = txtTituloAlbum.Text.Trim();
                    metadadoImagem.mti_ds_criador = txtCriadorAlbum.Text.Trim();
                    metadadoImagem.mti_ds_assunto = txtAssuntoAlbum.Text.Trim();
                    metadadoImagem.mti_ds_descricao = txtDescricaoAlbum.Text.Trim();
                    metadadoImagem.mti_nm_publicador = txtPublicadorAlbum.Text.Trim();
                    metadadoImagem.mti_nm_contribuidor = txtContribuidorAlbum.Text.Trim();
                    metadadoImagem.mti_ds_tipo = txtTipoAlbum.Text.Trim();
                    metadadoImagem.mti_ds_formato = txtFormatoAlbum.Text.Trim();
                    metadadoImagem.mti_ds_identificador = txtIdentificadorAlbum.Text.Trim();
                    metadadoImagem.mti_ds_origem = txtOrigemAlbum.Text.Trim();
                    metadadoImagem.mti_ds_idioma = txtIdiomaAlbum.Text.Trim();
                    metadadoImagem.mti_ds_relacao = txtRelacaoAlbum.Text.Trim();
                    metadadoImagem.mti_ds_direitos = txtDireitosAlbum.Text.Trim();
                    if (!string.IsNullOrEmpty(txtDataCriacaoAlbum.Text))
                        metadadoImagem.mti_dt_data = Convert.ToDateTime(txtDataCriacaoAlbum.Text);
                    imagem.mti_metadado_imagem = metadadoImagem;
                }

                reclamacao.img_imagem = imagem;
                reclamacao.vdo_video = video;

                Localizacao localizacao = new Localizacao();

                double? latitude = uscReclamacaoLocalizacao.Latitude;
                double? longitude = uscReclamacaoLocalizacao.Longitude;
                if (latitude != null && longitude != null)
                {
                    localizacao.loc_ds_latitude = latitude.Value;
                    localizacao.loc_ds_longitude = longitude.Value;
                    reclamacao.loc_localizacao = localizacao;
                }

                string[] tags = txtTags.Text.Split(new[] { ',', '.', ';' });

                //Insere o objeto reclamacao e seus relacionamentos
                reclamacaoBl.Insert(reclamacao, int.Parse(ddlInstituicao.SelectedValue),
                    Common.RetornarUsuarioSessao(this).usr_ds_nickname, tags);

                LimparFormulario();
                lblMensagem.Text = "Reclamação cadastrada com sucesso";

            }
        }
        catch (Exception ex)
        {
            lblMensagem.Text = ex.Message + "\n" + ex.InnerException;
        }

    }

    private void LimparFormulario()
    {
        foreach (Control control in frmReclamacaoDetalhes.Controls)
        {
            if (control is TextBox)
            {
                ((TextBox)control).Text = string.Empty;
            }
            if(control is DropDownList)
            {
                ((DropDownList) control).SelectedIndex = -1;
            }
        }
        //ddlInstituicao.SelectedIndex = 0;
        //txtDescricao.Text = string.Empty;
        //txtTags.Text = string.Empty;
        //txtTituloVideo.Text = string.Empty;
        //txtCriadorVideo.Text = string.Empty;
        //txtAssuntoVideo.Text = string.Empty;
        //txtDescricaoVideo.Text = string.Empty;
        //txtPublicadorVideo.Text = string.Empty;
        //txtContribuidorVideo.Text = string.Empty;
        //txtDataCriacaoVideo.Text = string.Empty;
        //txtTipoVideo.Text = string.Empty;
        //txtFormatoVideo.Text = string.Empty;
        //txtIdentificadorVideo.Text = string.Empty;
        //txtOrigemVideo.Text = string.Empty;
        //txtIdiomaVideo.Text = string.Empty;
        //txtRelacaoVideo.Text = string.Empty;
        //txtDireitosVideo.Text = string.Empty;
        //ltrVideo.Text = string.Empty;

      

        foreach (Control control in frmInformacoesAlbum.Controls)
        {
            if (control is TextBox)
            {
                ((TextBox)control).Text = string.Empty;
            }
            if (control is DropDownList)
            {
                ((DropDownList)control).SelectedIndex = -1;
            }
        }

        foreach (Control control in frmAlbumDetalhes.Controls)
        {
            if (control is TextBox)
            {
                ((TextBox)control).Text = string.Empty;
            }
        }

        foreach (Control control in frmVideo.Controls)
        {
            if (control is TextBox)
            {
                ((TextBox)control).Text = string.Empty;
            }

            if(control is Literal)
            {
                ((Literal)control).Text = string.Empty;
            }
        }

        foreach (Control control in frmVideoDetalhes.Controls)
        {
            if (control is TextBox)
            {
                ((TextBox)control).Text = string.Empty;
            }
        }

        uscReclamacaoLocalizacao.LimparControles();
        ddlAlbuns.Items.Clear();
    }
    protected void btnLimpar_Click(object sender, EventArgs e)
    {
        LimparFormulario();
    }
    protected void btnCancelar_Click(object sender, EventArgs e)
    {
        Response.Redirect("~/Default.aspx");
    }

    protected void imbExibirVideo_Click(object sender, ImageClickEventArgs e)
    {
        ltrVideo.Text = ObterVídeo(txtUrlVideo.Text);
    }

    //Popula o drop down de albuns do usuário
    private void PopularDropDownAlbuns()
    {
        //Cria uma conecxão com o Flickr
        Flickr flickr = new Flickr(Constantes.FLICKRAPIKEY);

        //Localiza o usuário através do email
        
        FoundUser user = flickr.PeopleFindByUserName(txtUsuarioFlickr.Text.Trim());

        //Obtem a colecao de albuns do usuario
        PhotosetCollection albuns = flickr.PhotosetsGetList(user.UserId);

        ddlAlbuns.DataSource = albuns;
        ddlAlbuns.DataValueField = "PhotosetId";
        ddlAlbuns.DataTextField = "Title";
        ddlAlbuns.DataBind();

        //Configura drop down de albuns do usuário
        ddlAlbuns.Items.Insert(0, new ListItem("Selecione um álbum...", ""));
    }

    //Popula do repeater com imagens do album selecionado
    private void PopularRepeaterAlbuns(string albumId)
    {
        Flickr flickr = new Flickr(Constantes.FLICKRAPIKEY);

        PhotosetPhotoCollection photoSetCollection = flickr.PhotosetsGetPhotos(albumId);

        rptImagens.DataSource = photoSetCollection;
        rptImagens.DataBind();
    }

    private string RetornarUrlAlbumFlickr(string setId)
    {
        try
        {
            Flickr flickr = new Flickr(Constantes.FLICKRAPIKEY);

            //FoundUser user = flickr.PeopleFindByEmail(txtUsuarioFlickr.Text);
            FoundUser user = flickr.PeopleFindByUserName(txtUsuarioFlickr.Text);

            PhotosetCollection photoSetCollection = flickr.PhotosetsGetList(user.UserId);

            foreach (Photoset set in photoSetCollection)
            {
                if (set.PhotosetId.Equals(setId))
                    return set.Url;
            }
        }
        catch (Exception ex)
        {
            lblMensagem.Text = ex.Message + " - " + ex.InnerException;
        }
        return string.Empty;
    }

    protected void ddlAlbuns_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ddlAlbuns.SelectedIndex > -1)
        {
            Flickr flickr = new Flickr(Constantes.FLICKRAPIKEY);
            Photoset album = flickr.PhotosetsGetInfo(ddlAlbuns.SelectedValue);
            if (album != null)
            {
                txtTituloAlbum.Text = album.Title;
                txtDescricaoAlbum.Text = album.Description;
                Person proprietarioAlbum = flickr.PeopleGetInfo(album.OwnerId);

                if (proprietarioAlbum != null)
                {
                    txtCriadorAlbum.Text = proprietarioAlbum.RealName;
                }
            }

            this.PopularRepeaterAlbuns(ddlAlbuns.SelectedValue);
        }
    }

    //private TipoOperacao RetornarTipoOperacao()
    //{
    //    return (TipoOperacao)int.Parse(Request["op"]);
    //}

    //private void PreencherControles()
    //{
    //    //int idReclamacao = Convert.ToInt32(SOMSecurity.Decodificar(Request["recId"]));
    //    int idReclamacao = Convert.ToInt32(Request["recId"]);

    //    SOMAbstractDALFactory factory = new SOMConcreteDALFactory();
    //    ReclamacaoDAL reclamacaoDAL = factory.CreateReclamacaoDAL();
    //    Reclamacao reclamacao = reclamacaoDAL.FindById(idReclamacao);

    //    if (reclamacao == null)
    //        return;

    //    //Detalhes da reclamacao 
    //    txtDescricao.Text = reclamacao.rec_ds_reclamacao;

    //    string dsTag = string.Empty;
    //    foreach (SOM.Model.Tag tag in reclamacao.tag)
    //    {
    //        dsTag += tag.tag_ds_tag + ",";
    //    }

    //    dsTag = dsTag.TrimEnd(',');
    //    txtTags.Text = dsTag;

    //    ddlInstituicao.SelectedValue = reclamacao.ins_instituicao.ins_id_instituicao.ToString();

    //    //Controles do video
    //    if (reclamacao.vdo_video != null)
    //    {
    //        Video video = reclamacao.vdo_video;

    //        txtTituloVideo.Text = video.mtd_metadado.mtd_ds_titulo;
    //        txtCriadorVideo.Text = video.mtd_metadado.mtd_ds_criador;
    //        txtAssuntoVideo.Text = video.mtd_metadado.mtd_ds_assunto;
    //        txtDescricaoVideo.Text = video.mtd_metadado.mtd_ds_descricao;
    //        txtPublicadorVideo.Text = video.mtd_metadado.mtd_nm_publicador;
    //        txtContribuidorVideo.Text = video.mtd_metadado.mtd_nm_contribuidor;
    //        txtDataCriacaoVideo.Text = video.mtd_metadado.mtd_dt_data.ToString();
    //        txtTipoVideo.Text = video.mtd_metadado.mtd_ds_tipo;
    //        txtFormatoVideo.Text = video.mtd_metadado.mtd_ds_formato;
    //        txtIdentificadorVideo.Text = video.mtd_metadado.mtd_ds_identificador;
    //        txtOrigemVideo.Text = video.mtd_metadado.mtd_ds_origem;
    //        txtIdiomaVideo.Text = video.mtd_metadado.mtd_ds_idioma;
    //        txtRelacaoVideo.Text = video.mtd_metadado.mtd_ds_relacao;
    //        txtDireitosVideo.Text = video.mtd_metadado.mtd_ds_direitos;

    //        txtUrlVideo.Text = video.vdo_ds_url;
    //        ltrVideo.Text = ObterVídeo(video.vdo_ds_url);
    //    }

    //    //Controles do Album
    //    if (reclamacao.img_imagem != null)
    //    {
    //        Imagem imagem = reclamacao.img_imagem;

    //        txtTituloAlbum.Text = imagem.mtd_metadado.mtd_ds_titulo;
    //        txtCriadorAlbum.Text = imagem.mtd_metadado.mtd_ds_criador;
    //        txtAssuntoAlbum.Text = imagem.mtd_metadado.mtd_ds_assunto;
    //        txtDescricaoAlbum.Text = imagem.mtd_metadado.mtd_ds_descricao;
    //        txtPublicadorAlbum.Text = imagem.mtd_metadado.mtd_nm_publicador;
    //        txtContribuidorAlbum.Text = imagem.mtd_metadado.mtd_nm_contribuidor;
    //        txtDataCriacaoAlbum.Text = imagem.mtd_metadado.mtd_dt_data.ToString();
    //        txtTipoAlbum.Text = imagem.mtd_metadado.mtd_ds_tipo;
    //        txtFormatoAlbum.Text = imagem.mtd_metadado.mtd_ds_formato;
    //        txtIdentificadorAlbum.Text = imagem.mtd_metadado.mtd_ds_identificador;
    //        txtOrigemAlbum.Text = imagem.mtd_metadado.mtd_ds_origem;
    //        txtIdiomaAlbum.Text = imagem.mtd_metadado.mtd_ds_idioma;
    //        txtRelacaoAlbum.Text = imagem.mtd_metadado.mtd_ds_relacao;
    //        txtDireitosAlbum.Text = imagem.mtd_metadado.mtd_ds_direitos;

    //        txtUsuarioFlickr.Text = imagem.img_usr_flickr;
    //    }

    //    //Marca a posicao no mapa
    //    if (reclamacao.loc_localizacao != null)
    //    {
    //        Localizacao localizacao = reclamacao.loc_localizacao;

    //        double latitude = localizacao.loc_ds_latitude.Value;
    //        double longitude = localizacao.loc_ds_longitude.Value;

    //        uscReclamacaoLocalizacao.MarcarPosicao(latitude, longitude);
    //    }
    //}

    protected void imbLogarFlickr_Click(object sender, ImageClickEventArgs e)
    {
        try
        {
            this.PopularDropDownAlbuns();
        }
        catch (Exception ex)
        {
            Response.Redirect(ErrorPage);
            lblMensagem.Text = ex.Message + " - " + ex.InnerException;
        }
    }

}
